<!doctype html>
<html lang="zh-CN">
<head>
	<meta charset="utf-8">
	<title>Laravel - 为 WEB 艺术家创造的 PHP 框架。 | Laravel 中文网</title>
	<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
	<meta name="author" content="Laravel 中文网">
	<meta name="description" content="Laravel - 为 WEB 艺术家创造的 PHP 框架。| Laravel 中文网">
	<meta name="keywords" content="Laravel中文社区,php框架,laravel中文网,php framework,restful routing,laravel,laravel php">
	<meta name="viewport" content="width=device-width, initial-scale=1">
	<!--[if lte IE 9]>
		<script src="http://cdn.bootcss.com/html5shiv/3.7.2/html5shiv.min.js"></script>
	<![endif]-->
	<meta name="viewport" content="width=device-width, initial-scale=1">
	<link rel="stylesheet" href="../../assets/css/laravel.css">
</head>
<body class="docs language-php">

	<span class="overlay"></span>

	<nav class="main">
		<div class="container">
			<a href="../../index.html" class="brand">
				<img src="../../assets/img/laravel-logo.png" height="30">
				Laravel
			</a>

			<div class="responsive-sidebar-nav">
				<a href="#" class="toggle-slide menu-link btn">&#9776;</a>
			</div>

				<div class="switcher">
					<div class="dropdown">
						<button class="btn dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown" aria-expanded="true">
							<!--<span class="faint">v</span> -->
							4.0
							<span class="caret"></span>
						</button>
						<ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenu1">
								<li role="presentation">
									<a role="menuitem" tabindex="-1" href="../5.0/index.html">5.0</a>
								</li>
								<li role="presentation">
									<a role="menuitem" tabindex="-1" href="../4.2/index.html">4.2</a>
								</li>
								<li role="presentation">
									<a role="menuitem" tabindex="-1" href="../4.1/index.html">4.1</a>
								</li>
								<li role="presentation">
									<a role="menuitem" tabindex="-1" href="index.html">4.0</a>
								</li>
						</ul>
					</div>
				</div>

			<ul class="main-nav">
				<li class="nav-docs"><a href="../index.html">中文文档</a></li>
				<li class="nav-community"><a href="http://wenda.golaravel.com" target="_blank">问答社区</a></li>
				<li class="nav-api"><a href="http://laravel.com/api/5.0/" target="_blank">API</a></li>
				<li class="nav-laracasts"><a href="https://laracasts.com" target="_blank">视频教程（国外）</a></li>
				<li class="nav-forge"><a href="https://forge.laravel.com" target="_blank">Forge</a></li>
				
			</ul>
		</div>
	</nav>

		<nav id="slide-menu" class="slide-menu" role="navigation">
		
		<div class="brand">
			<a href="../../index.html">
				<img src="../../assets/img/laravel-logo-white.png" height="50">
			</a>
		</div>

		<ul class="slide-main-nav">
			<li><a href="../../index.html">首页</a></li>
			<li class="nav-docs"><a href="../index.html">中文文档</a></li>
			<li class="nav-community"><a href="http://wenda.golaravel.com" target="_blank">问答社区</a></li>
			<li class="nav-api"><a href="http://laravel.com/api/5.0/" target="_blank">API</a></li>
			<li class="nav-laracasts"><a href="https://laracasts.com" target="_blank">视频教程（国外）</a></li>
			<li class="nav-forge"><a href="https://forge.laravel.com" target="_blank">Forge</a></li>
			
		</ul>

		<div class="slide-docs-nav">
			<h2>文档目录</h2>
			<ul>
<li>序言
<ul>
<li><a href="introduction.html">简介</a></li>
<li><a href="quick.html">快速入门</a></li>
<li><a href="contributing.html">为Laravel做贡献</a></li>
</ul>
</li>
<li>开始学习
<ul>
<li><a href="installation.html">安装</a></li>
<li><a href="configuration.html">配置</a></li>
<li><a href="lifecycle.html">Request的生命周期</a></li>
<li><a href="routing.html">路由</a></li>
<li><a href="requests.html">请求与输入</a></li>
<li><a href="responses.html">视图 &amp; Response</a></li>
<li><a href="controllers.html">控制器</a></li>
<li><a href="errors.html">错误 &amp; 日志</a></li>
</ul>
</li>
<li>深度历险
<ul>
<li><a href="cache.html">缓存</a></li>
<li><a href="extending.html">核心扩展</a></li>
<li><a href="events.html">事件</a></li>
<li><a href="facades.html">Facades</a></li>
<li><a href="html.html">表单 &amp; HTML</a></li>
<li><a href="helpers.html">有用的工具函数</a></li>
<li><a href="ioc.html">IoC 容器</a></li>
<li><a href="localization.html">本地化</a></li>
<li><a href="mail.html">邮件</a></li>
<li><a href="packages.html">扩展包开发</a></li>
<li><a href="pagination.html">分页</a></li>
<li><a href="queues.html">队列</a></li>
<li><a href="security.html">安全</a></li>
<li><a href="session.html">Session</a></li>
<li><a href="templates.html">模版</a></li>
<li><a href="testing.html">单元测试</a></li>
<li><a href="validation.html">验证</a></li>
</ul>
</li>
<li>数据库
<ul>
<li><a href="database.html">基本用法</a></li>
<li><a href="queries.html">查询构造器</a></li>
<li><a href="eloquent.html">Eloquent ORM</a></li>
<li><a href="schema.html">结构生成器</a></li>
<li><a href="migrations.html">迁移 &amp; 数据填充</a></li>
<li><a href="redis.html">Redis</a></li>
</ul>
</li>
<li>Artisan 命令行工具
<ul>
<li><a href="artisan.html">概览</a></li>
<li><a href="commands.html">Artisan 开发</a></li>
</ul>
</li>
<li>贡献者
<ul>
<li><a href="contributors.html">中文翻译贡献者名单</a></li>
</ul>
</li>
</ul>

		</div>

	</nav>

	<div class="docs-wrapper container">

		<section class="sidebar">
			<ul>
<li>序言
<ul>
<li><a href="introduction.html">简介</a></li>
<li><a href="quick.html">快速入门</a></li>
<li><a href="contributing.html">为Laravel做贡献</a></li>
</ul>
</li>
<li>开始学习
<ul>
<li><a href="installation.html">安装</a></li>
<li><a href="configuration.html">配置</a></li>
<li><a href="lifecycle.html">Request的生命周期</a></li>
<li><a href="routing.html">路由</a></li>
<li><a href="requests.html">请求与输入</a></li>
<li><a href="responses.html">视图 &amp; Response</a></li>
<li><a href="controllers.html">控制器</a></li>
<li><a href="errors.html">错误 &amp; 日志</a></li>
</ul>
</li>
<li>深度历险
<ul>
<li><a href="cache.html">缓存</a></li>
<li><a href="extending.html">核心扩展</a></li>
<li><a href="events.html">事件</a></li>
<li><a href="facades.html">Facades</a></li>
<li><a href="html.html">表单 &amp; HTML</a></li>
<li><a href="helpers.html">有用的工具函数</a></li>
<li><a href="ioc.html">IoC 容器</a></li>
<li><a href="localization.html">本地化</a></li>
<li><a href="mail.html">邮件</a></li>
<li><a href="packages.html">扩展包开发</a></li>
<li><a href="pagination.html">分页</a></li>
<li><a href="queues.html">队列</a></li>
<li><a href="security.html">安全</a></li>
<li><a href="session.html">Session</a></li>
<li><a href="templates.html">模版</a></li>
<li><a href="testing.html">单元测试</a></li>
<li><a href="validation.html">验证</a></li>
</ul>
</li>
<li>数据库
<ul>
<li><a href="database.html">基本用法</a></li>
<li><a href="queries.html">查询构造器</a></li>
<li><a href="eloquent.html">Eloquent ORM</a></li>
<li><a href="schema.html">结构生成器</a></li>
<li><a href="migrations.html">迁移 &amp; 数据填充</a></li>
<li><a href="redis.html">Redis</a></li>
</ul>
</li>
<li>Artisan 命令行工具
<ul>
<li><a href="artisan.html">概览</a></li>
<li><a href="commands.html">Artisan 开发</a></li>
</ul>
</li>
<li>贡献者
<ul>
<li><a href="contributors.html">中文翻译贡献者名单</a></li>
</ul>
</li>
</ul>

		</section>

		<article>
			<h1>控制器</h1>
<ul>
<li><a href="#basic-controllers">基础控制器</a></li>
<li><a href="#controller-filters">控制器过滤器</a></li>
<li><a href="#restful-controllers">RESTful 控制器</a></li>
<li><a href="#resource-controllers">资源控制器</a></li>
<li><a href="#handling-missing-methods">处理空方法</a></li>
</ul>
<p><a name="basic-controllers"></a></p>
<h2>基础控制器 （Basic Controllers）</h2>
<p>与其把所有路由逻辑写在一个 <code>routes.php</code> 文件中，你也许更希望用控制器类来组织它们。控制器可以把相关的路由逻辑组织在一个类中，而且可以使用由框架提供的更为强大的功能，比如自动<a href="../ioc">依赖注入</a>。</p>
<p>控制器一般储存在 <code>app/controllers</code> 目录下，这个目录默认已经被注册在 <code>composer.json</code> 文件的 <code>classmap</code> 属性中。</p>
<p>这是一个基础控制器的例子：</p>
<pre><code>class UserController extends BaseController {

    /**
     * Show the profile for the given user.
     */
    public function showProfile($id)
    {
        $user = User::find($id);

        return View::make('user.profile', array('user' =&gt; $user));
    }

}
</code></pre>
<p>所有控制器需要继承 <code>BaseController</code> 类。 <code>BaseController</code> 类也储存在 <code>app/controllers</code> 下，通常用来放置公用的控制器逻辑。 <code>BaseController</code> 类继承自框架的 <code>Controller</code> 类。现在，你可以在路由中像这样调用控制器操作：</p>
<pre><code>Route::get('user/{id}', 'UserController@showProfile');
</code></pre>
<p>如果你需要使用PHP命名空间嵌套组织控制器，你可以在定义路由时使用类名的全称：</p>
<pre><code>Route::get('foo', 'Namespace\FooController@method');
</code></pre>
<p>你也可以在控制器路由中指定名称：</p>
<pre><code>Route::get('foo', array('uses' =&gt; 'FooController@method',
                                        'as' =&gt; 'name'));
</code></pre>
<p>你可以使用 <code>URL::action</code> 方法获取一个控制器操作的链接：</p>
<pre><code>$url = URL::action('FooController@method');
</code></pre>
<p>你可以使用 <code>currentRouteAction</code> 方法获取当前控制器操作的名称：</p>
<pre><code>$action = Route::currentRouteAction();
</code></pre>
<p><a name="controller-filters"></a></p>
<h2>控制器过滤器 （Controller Filters）</h2>
<p><a href="../routing#route-filters">过滤器</a>可以在控制器路由中指定，就像这样一个&quot;标准的&quot;路由：</p>
<pre><code>Route::get('profile', array('before' =&gt; 'auth',
            'uses' =&gt; 'UserController@showProfile'));
</code></pre>
<p>不过，你也可以在控制器内部指定过滤器：</p>
<pre><code>class UserController extends BaseController {

    /**
     * Instantiate a new UserController instance.
     */
    public function __construct()
    {
        $this-&gt;beforeFilter('auth');

        $this-&gt;beforeFilter('csrf', array('on' =&gt; 'post'));

        $this-&gt;afterFilter('log', array('only' =&gt;
                            array('fooAction', 'barAction')));
    }

}
</code></pre>
<p>你也可以使用闭包来指定内联的控制器过滤器：</p>
<pre><code>class UserController extends BaseController {

    /**
     * Instantiate a new UserController instance.
     */
    public function __construct()
    {
        $this-&gt;beforeFilter('auth', array('except' =&gt; 'getLogin'));

        $this-&gt;beforeFilter('csrf', array('on' =&gt; 'post'));

        $this-&gt;afterFilter('log', array('only' =&gt;
                            array('fooAction', 'barAction')));
    }

}
</code></pre>
<p><a name="restful-controllers"></a></p>
<h2>RESTful 控制器 （RESTful Controllers）</h2>
<p>Laravel框架中，你可以使用简单的REST命名规范，轻松定义单个路由去处理控制器的每个操作。首先，使用 <code>Route::controller</code> 方法定义路由：</p>
<p><strong>定义一个 RESTful 控制器</strong></p>
<pre><code>Route::controller('users', 'UserController');
</code></pre>
<p><code>controller</code> 方法接受两个参数。第一个是基础URI控制器句柄，第二个是控制器的类名。接下来，就可以在控制器中添加带有相应HTTP动词前缀的方法：</p>
<pre><code>class UserController extends BaseController {

    public function getIndex()
    {
        //
    }

    public function postProfile()
    {
        //
    }

}
</code></pre>
<p><code>index</code> 方法会应答带有这个控制器句柄的根URI（例如这个例子里的是 <code>users</code> ）。</p>
<p>如果你的控制器操作名称包含多个单词，你可以使用 &quot;破折号&quot; 语法来获得URI。例如，下面 <code>UserController</code> 控制器中的这个操作会用来应答 <code>users/admin-profile</code> URI：</p>
<pre><code>public function getAdminProfile() {}
</code></pre>
<p><a name="resource-controllers"></a></p>
<h2>资源控制器 （Resource Controllers）</h2>
<p>资源控制器让围绕资源构建RESTful模式控制器变得更简单。比如，你可能希望创建一个的控制器，用来管理通过你的应用储存的图片（ &quot;photos&quot; ）。通过Artisan命令行输入 <code>controller:make</code> 命令以及路由中的 <code>Route::resource</code> 方法快速创建一个控制器。</p>
<p>如果要通过命令行创建控制器，使用如下命令：</p>
<pre><code>php artisan controller:make PhotoController
</code></pre>
<p>现在我们可以为这个控制器注册一个资源模式的路由：</p>
<pre><code>Route::resource('photo', 'PhotoController');
</code></pre>
<p>这一个路由声明创建了多个路由规则，用来处理各种图像（photo）资源的RESTful操作。同样地，刚刚创建的控制器中已经包含了许多对应的方法。每个方法都带有注释说明，告诉你分别是用来处理什么URI和HTTP动词的。</p>
<p><strong>资源控制器中不同操作的用途</strong></p>
<table>
<thead>
<tr><th>Verb</th><th>Path</th><th>Action</th><th>Route Name</th></tr>
</thead>
<tbody>
<tr><td>GET</td><td>/resource</td><td>index</td><td>resource.index</td></tr>
<tr><td>GET</td><td>/resource/create</td><td>create</td><td>resource.create</td></tr>
<tr><td>POST</td><td>/resource</td><td>store</td><td>resource.store</td></tr>
<tr><td>GET</td><td>/resource/{resource}</td><td>show</td><td>resource.show</td></tr>
<tr><td>GET</td><td>/resource/{resource}/edit</td><td>edit</td><td>resource.edit</td></tr>
<tr><td>PUT/PATCH</td><td>/resource/{resource}</td><td>update</td><td>resource.update</td></tr>
<tr><td>DELETE</td><td>/resource/{resource}</td><td>destroy</td><td>resource.destroy</td></tr>
</tbody>
</table>
<p>有时你也许只需要处理其中一部分资源操作：</p>
<pre><code>php artisan controller:make PhotoController --only=index,show

php artisan controller:make PhotoController --except=index
</code></pre>
<p>同样，你也许需要在路由中制定那一部分要处理的操作：</p>
<pre><code>Route::resource('photo', 'PhotoController',
                array('only' =&gt; array('index', 'show')));

Route::resource('photo', 'PhotoController',
                array('except' =&gt; array('create', 'store', 'update', 'delete')));
</code></pre>
<p><a name="handling-missing-methods"></a></p>
<h2>处理空方法 （Handling Missing Methods）</h2>
<p>当控制器中没有任何方法匹配请求时，就会调用一个全局响应的方法。这个方法命名为 <code>missingMethod</code> ，它接收请求的参数数组作为方法的唯一参数。</p>
<p><strong>定义一个空方法</strong></p>
<pre><code>public function missingMethod($parameters)
{
    //
}</code></pre>

		</article>
	</div>


	<footer class="main">
		<ul>
			<li class="nav-docs"><a href="../index.html">中文文档</a></li>
			<li class="nav-community"><a href="http://wenda.golaravel.com" target="_blank">问答社区</a></li>
			<li class="nav-api"><a href="http://laravel.com/api/5.0/" target="_blank">API</a></li>
			<li class="nav-laracasts"><a href="https://laracasts.com" target="_blank">视频教程（国外）</a></li>
			<li class="nav-forge"><a href="https://forge.laravel.com" target="_blank">Forge</a></li>
			
		</ul>
		<p>Laravel is a trademark of Taylor Otwell. Copyright &copy; Taylor Otwell.</p>
		<p class="less-significant"><a href="http://jackmcdade.com" target="_blank">Design by Jack McDade</a></p>
	</footer>

	<script src="../../assets/js/laravel.js"></script>
	<script src="../../assets/js/viewport-units-buggyfill.js"></script>
	<script>window.viewportUnitsBuggyfill.init();</script>
	<script type="text/javascript">
	var _bdhmProtocol = (("https:" == document.location.protocol) ? " https://" : " http://");
	document.write(unescape("%3Cscript src='" + _bdhmProtocol + "hm.baidu.com/h.js%3Fc8d13872a523d9c286aa7affbe0921f1' type='text/javascript'%3E%3C/script%3E"));
	</script>
</body>
</html>
